package com.bdqn.repository;

import com.bdqn.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * User实体数据库操作接口（继承JpaRepository<要操作的实体, 主键类型>，包含基本的增删改查功能）
 *
 * @author LILIBO
 * @since 2023-11-27
 */
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {

    // 什么都不用写就拥有增删改查等通用功能

    // 自定义个性化接口

    /**
     * 通过用户名查找用户
     *
     * @param usrName
     * @return
     */
    List<User> findByUsrName(String usrName);

    /**
     * 通过用户名查找用户
     *
     * @param usrName
     * @return
     */
    List<User> findByUsrNameLike(String usrName);

    /**
     * 通过用户名查找用户（参数对应与方法名有关，跟形参名称无关）
     *
     * @param usrPassword
     * @param usrName
     * @return
     */
    List<User> findByUsrNameAndUsrPassword(String usrPassword, String usrName);

    /**
     * 使用HQL语句实现复杂查询（注意：HQL面向实体类和属性，语句中不能写表名和字段名）
     *
     * @param roleId
     * @return
     */
    /* @Query("select u from User u where u.usrRoleId=?1")
    List<User> findByRoleId(Long roleId); */

    /**
     * 使用原生SQL语句实现复杂查询（注意：增加参数）
     *
     * @param roleId
     * @return
     */
    @Query(value = "select u.* from sys_user u where u.usr_role_id=?1", nativeQuery = true)
    List<User> findByRoleIdNativeQuery(Long roleId);

    /**
     * 使用原生SQL语句实现复杂查询（注意：增加参数）
     *
     * @param roleId
     * @return
     */
    @Query(value = "select u.* from sys_user u where u.usr_role_id=:roleId", nativeQuery = true)
    List<User> findByRoleIdParam(@Param("roleId") Long roleId);

    /**
     * 根据Id修改用户名
     *
     * @param usrName
     * @param usrId
     * @return
     */
    @Transactional(timeout = 20)
    @Modifying
    @Query("update User u set u.usrName=?1 where u.usrId=?2")
    int modifyNameById(String usrName, Long usrId);

    /**
     * 命名QL 如果希望根据接口方法名来实现数据库操作，则应命名为： findUsersByUsrName
     *
     * @param usrName
     * @return
     */
    List<User> findUsersByName(String usrName);

    /**
     * 分页查询（Pageable作为形参，返回类型为Page）
     *
     * @param roleId
     * @param pageable
     * @return
     */
    /* @Query("select u from User u where u.usrRoleId=?1")
    Page<User> findPageByUsrRoleId(Long roleId, Pageable pageable); */

    /**
     * 通过接口接收查询到的数据
     *
     * @param usrId
     * @return
     */
    /* @Query("select u.usrId as usrId, u.usrName as usrName, u.usrPassword as usrPassword, u.usrRoleId as usrRoleId, u.usrFlag as usrFlag, r.roleName as roleName from User u, Role r where u.usrRoleId=r.roleId and u.usrId=?1")
    UserInfo getUserInfo(Long usrId); */

}
